X-Git-Url: https://git.r.bdr.sh/rbdr/map/blobdiff_plain/144915635bdfc90445321189914929a911fe77d4..ed10ac191df473c92c4fec495aafa7f569d108c8:/Map/Presentation/Base%20Components/MapTextEditor.swift?ds=sidebyside diff --git a/Map/Presentation/Base Components/MapTextEditor.swift b/Map/Presentation/Base Components/MapTextEditor.swift index a7dbe52..ff98203 100644 --- a/Map/Presentation/Base Components/MapTextEditor.swift +++ b/Map/Presentation/Base Components/MapTextEditor.swift @@ -1,19 +1,17 @@ -/* - Copyright (C) 2024 Rubén Beltrán del Río - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see https://map.tranquil.systems. - */ +// Copyright (C) 2024 Rubén Beltrán del Río + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see https://map.tranquil.systems. import Cocoa import SwiftUI @@ -66,7 +64,7 @@ class MapTextEditorController: NSViewController { scrollView.translatesAutoresizingMaskIntoConstraints = false - textView.backgroundColor = .ui.background + textView.backgroundColor = .UI.background textView.allowsUndo = true textView.delegate = self textView.textStorage?.delegate = self @@ -91,10 +89,11 @@ class MapTextEditorController: NSViewController { textStorage.removeAttribute( .backgroundColor, range: NSRange(location: 0, length: textStorage.length)) - for range in highlightRanges { + for (index, range) in highlightRanges.enumerated() { let nsRange = NSRange(range, in: textStorage.string) - textStorage.addAttribute(.backgroundColor, value: NSColor.syntax.match, range: nsRange) + let color = index == selectedRange ? NSColor.Syntax.highlightMatch : NSColor.Syntax.match + textStorage.addAttribute(.backgroundColor, value: color, range: nsRange) } textView.needsDisplay = true @@ -110,19 +109,10 @@ class MapTextEditorController: NSViewController { let range = highlightRanges[selectedRange] let nsRange = NSRange(range, in: textStorage.string) textView.scrollRangeToVisible(nsRange) - textView.selectedRange = nsRange } } } } - - private func setSelectionColor() { - guard let textView = self.textView else { return } - - var selectedTextAttributes = textView.selectedTextAttributes - selectedTextAttributes[.backgroundColor] = NSColor.yellow.withAlphaComponent(0.3) - textView.selectedTextAttributes = selectedTextAttributes - } } extension MapTextEditorController: NSTextViewDelegate { @@ -166,77 +156,77 @@ extension MapTextEditorController: NSTextStorageDelegate { for match in matches { textStorage.addAttributes( - [.foregroundColor: NSColor.syntax.vertex], range: match.range(at: 1)) + [.foregroundColor: NSColor.Syntax.vertex], range: match.range(at: 1)) textStorage.addAttributes( - [.foregroundColor: NSColor.syntax.number], range: match.range(at: 2)) + [.foregroundColor: NSColor.Syntax.number], range: match.range(at: 2)) textStorage.addAttributes( - [.foregroundColor: NSColor.syntax.number], range: match.range(at: 3)) + [.foregroundColor: NSColor.Syntax.number], range: match.range(at: 3)) textStorage.addAttributes( - [.foregroundColor: NSColor.syntax.option], range: match.range(at: 4)) + [.foregroundColor: NSColor.Syntax.option], range: match.range(at: 4)) } matches = edgeRegex.matches(in: textStorage.string, options: [], range: range) for match in matches { textStorage.addAttributes( - [.foregroundColor: NSColor.syntax.vertex], range: match.range(at: 1)) + [.foregroundColor: NSColor.Syntax.vertex], range: match.range(at: 1)) let arrowRange = match.range(at: 2) textStorage.addAttributes( - [.foregroundColor: NSColor.syntax.symbol], + [.foregroundColor: NSColor.Syntax.symbol], range: NSMakeRange(arrowRange.lowerBound - 1, arrowRange.length + 1)) textStorage.addAttributes( - [.foregroundColor: NSColor.syntax.vertex], range: match.range(at: 3)) + [.foregroundColor: NSColor.Syntax.vertex], range: match.range(at: 3)) } matches = opportunityRegex.matches(in: textStorage.string, options: [], range: range) for match in matches { textStorage.addAttributes( - [.foregroundColor: NSColor.syntax.option], range: match.range(at: 1)) + [.foregroundColor: NSColor.Syntax.option], range: match.range(at: 1)) textStorage.addAttributes( - [.foregroundColor: NSColor.syntax.vertex], range: match.range(at: 2)) + [.foregroundColor: NSColor.Syntax.vertex], range: match.range(at: 2)) textStorage.addAttributes( - [.foregroundColor: NSColor.syntax.symbol], range: match.range(at: 3)) + [.foregroundColor: NSColor.Syntax.symbol], range: match.range(at: 3)) textStorage.addAttributes( - [.foregroundColor: NSColor.syntax.number], range: match.range(at: 4)) + [.foregroundColor: NSColor.Syntax.number], range: match.range(at: 4)) } matches = blockerRegex.matches(in: textStorage.string, options: [], range: range) for match in matches { textStorage.addAttributes( - [.foregroundColor: NSColor.syntax.option], range: match.range(at: 1)) + [.foregroundColor: NSColor.Syntax.option], range: match.range(at: 1)) textStorage.addAttributes( - [.foregroundColor: NSColor.syntax.vertex], range: match.range(at: 2)) + [.foregroundColor: NSColor.Syntax.vertex], range: match.range(at: 2)) } matches = noteRegex.matches(in: textStorage.string, options: [], range: range) for match in matches { textStorage.addAttributes( - [.foregroundColor: NSColor.syntax.option], range: match.range(at: 1)) + [.foregroundColor: NSColor.Syntax.option], range: match.range(at: 1)) textStorage.addAttributes( - [.foregroundColor: NSColor.syntax.number], range: match.range(at: 2)) + [.foregroundColor: NSColor.Syntax.number], range: match.range(at: 2)) textStorage.addAttributes( - [.foregroundColor: NSColor.syntax.number], range: match.range(at: 3)) + [.foregroundColor: NSColor.Syntax.number], range: match.range(at: 3)) } matches = stageRegex.matches(in: textStorage.string, options: [], range: range) for match in matches { textStorage.addAttributes( - [.foregroundColor: NSColor.syntax.option], range: match.range(at: 1)) + [.foregroundColor: NSColor.Syntax.option], range: match.range(at: 1)) textStorage.addAttributes( - [.foregroundColor: NSColor.syntax.number], range: match.range(at: 2)) + [.foregroundColor: NSColor.Syntax.number], range: match.range(at: 2)) } matches = groupRegex.matches(in: textStorage.string, options: [], range: range) for match in matches { textStorage.addAttributes( - [.foregroundColor: NSColor.syntax.option], range: match.range(at: 1)) + [.foregroundColor: NSColor.Syntax.option], range: match.range(at: 1)) textStorage.addAttributes( - [.foregroundColor: NSColor.syntax.vertex], range: match.range(at: 2)) + [.foregroundColor: NSColor.Syntax.vertex], range: match.range(at: 2)) } } } @@ -261,6 +251,8 @@ struct MapTextEditor: NSViewControllerRepresentable { context: NSViewControllerRepresentableContext ) { nsViewController.highlightRanges = highlightRanges - nsViewController.selectedRange = selectedRange + if nsViewController.selectedRange != selectedRange { + nsViewController.selectedRange = selectedRange + } } }